package co.edu.poli.ficb.agl.automatable.modelo;

import java.util.List;
import java.util.Set;
import java.util.TreeSet;

/**
 * @author  Diego Satoba
 * @author  Ingrid Baquero 
 * @version  1.1, 03/29/11
 * @since  1.0
 */
public class Alfabeto {
	
	/**
	 * Conjunto de simbolos del alfabeto.
	 * @uml.property  name="conjunto"
	 * @uml.associationEnd  multiplicity="(0 -1)" elementType="co.edu.poli.ficb.agl.automatable.modelo.SimboloImpl"
	 */
	private Set<Simbolo> conjunto;


	/**
	 * @return
	 * @uml.property  name="conjunto"
	 */
	public Set<Simbolo> getConjunto() {
		return conjunto;
	}

	/**
	 * @param conjunto
	 * @uml.property  name="conjunto"
	 */
	public void setConjunto(Set<Simbolo> conjunto) {
		this.conjunto = conjunto;
	}

	/**
	 * Constructor por defecto.
	 */
	public Alfabeto() {
		this.conjunto = new TreeSet<Simbolo>();
	}
	
	/**
	 * 
	 * @param conjunto El conjunto con los simbolos. 
	 */
	public Alfabeto(Set<Simbolo> conjunto) {
		this.conjunto = conjunto;
	}
	
	public Alfabeto(List<Simbolo> lista) {
		this();
		for (Simbolo s : lista) 
			this.conjunto.add(s);
	}
	
	/**
	 * 
	 * @param alfabeto
	 */
	public Alfabeto(String alfabeto) {
		this(); // inicializa conjunto.
		for (char c : alfabeto.toCharArray()) {
			this.conjunto.add(new SimboloImpl(c));
		}
	}
	
	public boolean agregarSimbolo(Simbolo simbolo) {
		return this.conjunto.add(simbolo);
	}
	
	public boolean removerSimbolo(Simbolo simbolo) {
		return this.conjunto.remove(simbolo);
	}
	
	public boolean contieneSimbolo(Simbolo simbolo) {
		return this.conjunto.contains(simbolo);
	}
	
	public String getComoString() {
		StringBuffer sb = new StringBuffer();
		for (Simbolo s : conjunto) {
			sb.append(s.toString());
		}
		return sb.toString();
	}
	
	@Override
	public boolean equals(Object o) {
		if (o instanceof Alfabeto) {
			if (this == o)
				return true;
			else {
				Alfabeto other = (Alfabeto) o;
				if (this.conjunto.size() == other.conjunto.size()) {
					for (Simbolo s : this.conjunto) {
						if (!other.conjunto.contains(s))
							return false;
					}
					return true;
				} else 
					return false;
			}
		}
		return false;
	}
	
	
	@Override
	public String toString() {
		StringBuffer sb = new StringBuffer("{");
		int idx = 0;
		for (Simbolo s : this.conjunto) { 
			sb.append((idx++==0?"":",")+s.toString());
		}
		sb.append("}");
		return sb.toString();
	}
}

